package com.njchy.statistics.util;

import lombok.extern.slf4j.Slf4j;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

/**
 * 获取当前同域的wlan的地址,真实物理主机地址
 * 无线局域网适配器 WLAN:
 * 连接特定的 DNS 后缀 . . . . . . . :
 * IPv4 地址 . . . . . . . . . . . . : 10.23.20.149
 * 子网掩码  . . . . . . . . . . . . : 255.255.255.0
 * 默认网关. . . . . . . . . . . . . : 10.23.20.254
 */
@Slf4j
public class QueryWlanAddressUtil {
    /**
     * 获取当前的wlan的IPv4地址
     *
     * @return
     */
    public static String getWlan() {
        // 获取所有网络接口实例
        Enumeration<NetworkInterface> networkInterfaces = null;
        try {
            networkInterfaces = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            log.info("网卡解析错误，请检查！");
            throw new RuntimeException(e);
        }
        String inRegionIp = null;
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = networkInterfaces.nextElement();
            // 检查接口名称是否包含 "WLAN" 或类似标识（视具体操作系统而定）
            if (networkInterface.getName().toLowerCase().contains("wlan")) {
                // 获取该接口的所有 InetAddress（IPv4 地址等）
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress ip = inetAddresses.nextElement();
                    // 确保获取的是内网地址且不是回环地址
                    if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress()) {
                        // 获取到内网 IP 地址
                        inRegionIp = ip.getHostAddress();
                        break; // 找到后可以跳出循环
                    }
                }
            }
            // 如果已经找到IP地址，则跳出外层循环
            if (inRegionIp != null) {
                break;
            }
        }
        // 打印获取到的 WLAN 的 IPv4 地址
        return inRegionIp;
    }


    /**
     * 获取以太网ipv4地址
     *
     * @return
     */
    public static String getInt() {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface iface = interfaces.nextElement();
                // 跳过回环接口和未启用的接口
                if (iface.isLoopback() || !iface.isUp()) continue;

                // 精确匹配Realtek以太网适配器(连接网络的使用描述获取)
                if (iface.getDisplayName().contains("Realtek PCIe GbE Family Controller")) {
                    Enumeration<InetAddress> addresses = iface.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress addr = addresses.nextElement();
                        // 只返回IPv4地址
                        if (addr instanceof Inet4Address && addr.isSiteLocalAddress()) {
                            return addr.getHostAddress();
                        }
                    }
                }
            }

            // 如果没有找到以太网适配器，则返回第一个有效的IPv4地址
            interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface iface = interfaces.nextElement();
                if (iface.isLoopback() || !iface.isUp()) continue;

                Enumeration<InetAddress> addresses = iface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();
                    if (addr instanceof Inet4Address && addr.isSiteLocalAddress()) {
                        return addr.getHostAddress();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
